OWASP ServerlessGoatを利用してセキュリティソフトの確認をする準備をしてみた
こんにちは、コンサル部@大阪オフィスのTodaです。
aqua社が提供しているAqua Enterprise版 を試す機会がありNanoEnforcerとLambdaサーバレスの動作を確認するためOWASP Serverless Goatを使ってみようと思い導入方法をまとめています。
OWASP Serverless Goat とは?
OWASP Serverless Goatはイスラエルの PureSec社 が作成したアプリケーションでThe Ten Most Critical Risks for Serverless Applications v1.0に基づき
セキュリティの教育、指導向けにわざと脆弱性を埋め込まれている状態で公開されているWeb アプリケーションになります。
PureSec社は2019年5月に企業買収されてそれ以降GitHubのアップデートが止まっていますが、現状でも利用可能とのことで確認用途に利用しています。
■ GitHub OWASP/Serverless-Goat
https://github.com/OWASP/Serverless-Goat
■ ServerlessRepo serverless-goat
https://serverlessrepo.aws.amazon.com/applications/ap-southeast-1/075675446607/serverless-goat
注意事項
脆弱性を利用したテストはAWSが掲載している「侵入テスト」のポリシーを確認いただき、決まりを遵守するようにお願いします。
■ ペネトレーションテスト(侵入テスト)- AWS セキュリティ|AWS
https://aws.amazon.com/jp/security/penetration-testing/
OWASP Serverless Goatは脆弱性が埋め込まれたアプリケーションになるためサービスが動作している実環境にはデプロイしないでください。
検証環境でセキュリティの勉強用途にご利用ください。
アプリケーションはIP制限を設定してご利用ください。
アプリケーションの導入
AWSへのログイン
検証用のAWS環境にログインをおこないます。
リポジトリから取得
AWS Serverless Application Repositoryにアクセスをしてserverless-goatのデプロイをおこないます。
■ ServerlessRepo serverless-goat
https://serverlessrepo.aws.amazon.com/applications/ap-southeast-1/075675446607/serverless-goat
画面表示右側の[Deploy]をクリックする事でSAMを利用したデプロイ画面が表示されます。
SAMの画面では内容は変更せず、画面下の[Deploy]をクリックします。
CloudFormationによる作成確認
デプロイを実行するとCloudFormationに「serverlessrepo-serverless-goat」という名称でスタックが作成されます。
ステータスがCREATE_COMPLETEになるのを待って[出力]欄に表示される[WebsiteURL]をクリックして画面が表示される事を確認します。
正常にデプロイができている場合、OWASP ServerlessGoatのページが表示されます。
※ロゴは開発元サイトが閉鎖されているため表示されません。
API Gatewayでアクセス制限
Serverless-GoatのAPIにアクセス制限を追加します。
[API Gateway]に移動をして作成されている[serverlessrepo-serverless-goat]を選択します。
[リソースポリシー]に移動をしてIPアクセスの制限を追記します。
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Deny", "Principal": "*", "Action": "execute-api:Invoke", "Resource": "arn:aws:execute-api:ap-northeast-1:(AWSアカウント番号):(API GatewayのID)/Prod/*", "Condition": { "NotIpAddress": { "aws:SourceIp": "XXX.XXX.XXX.XXX/32 ※許可するIPアドレス" } } }, { "Effect": "Allow", "Principal": "*", "Action": "execute-api:Invoke", "Resource": "arn:aws:execute-api:ap-northeast-1:(AWSアカウント番号):(API GatewayのID)/Prod/*" } ] }
リソースポリシーの保存をおこないます。
[リソース]に移動をおこない[アクション]から[APIのデプロイ]をおこないデプロイをおこないます。
デプロイはProd と Stage 両方におこないます。
上記でアプリケーションの導入は完了になります。
脆弱性の確認
脆弱性がある項目をいくつか試してみます。
スタックトレースの表示
アプリケーションではファイルのパスを指定してSubmitする機能があります。
パスはGET値で「document_url」にて送信されていますが上記を消した状態で再度送信をおこないます。
■ URLの例
https://[API Gatewayで指定されるURL]/Prod/api/convert
■ 画面表示
画面表示をするとdocument_urlが存在しないことでスタックトレースが表示されます。
表示には使っているスクリプトのパスが表示されていてプログラムの構造を一部把握する事ができます。
OSコマンドインジェクション
アプリケーションのファイル指定のフォームに「; sleep 5 #」と「; sleep 100 #」の内容を追加して[Submit]をしてみます。
※実際の入力は「http s://」のスペースを外して入力ください。
■ 入力例 (通常)
http s://www.puresec.io/hubfs/document.doc
■ 入力例 (sleep 5追加)
http s://www.puresec.io/hubfs/document.doc; sleep 5 #
■ 入力例 (sleep 100追加)
http s://www.puresec.io/hubfs/document.doc; sleep 100 #
実行をすると5を指定した方は、5秒経過後に表示がおこなわれ、100を指定した方は一定時間後「Internal server error」にてエラーになることがわかりました。
上記からプログラムにはOSコマンドインジェクションの問題があることが予測できます。
スクリプトの奪取
OSコマンドインジェクションとスタックトレースの内容を利用してプログラムの内容を奪取してみます。
先ほどスタックトレースにて「/var/task/index.js」というファイルが存在することを確認しています。
上記を catコマンド を利用して出力できるか確認してみます。
■ 入力例 (index.js パス指定)
http s://www.puresec.io/hubfs/document.doc; cat /var/task/index.js #
■ 画面表示
表示をするとスクリプトの内容を確認することができました。
スクリプトを見るとDynamoDBやaws-sdk、node-uuidライブラリの利用、環境変数が設定されていること、OSコマンドインジェクションの対策がされていないことがわかります。
環境変数の奪取
プログラムを確認する事でOSコマンドインジェクションの対策がされていないことがわかり環境変数の取得も出来そうということで試してみます。
取得は envコマンド を利用してみます。
■ 入力例 (index.js パス指定)
http s://www.puresec.io/hubfs/document.doc; env #
■ 画面表示
表示をすると環境変数などがすべて出力できることを確認できます。
その他脆弱性について
Serverless-Goatにはレッスンという形式で脆弱性が用意されています。
上記以外に確認できる脆弱性は「LESSONS.md」を参照ください。
■ GitHub OWASP/Serverless-Goat/LESSONS.md
https://github.com/OWASP/Serverless-Goat/blob/master/LESSONS.md
さいごに
今回はセキュリティの勉強、検証用途に利用できるOWASP ServerlessGoatをデプロイしてみました。
次回はAqua Enterprise版のNanoEnforcerを利用して脆弱性の対策を実装しています。